var SPSdk = (function () {
    var SDK_URL = "http://h5.mobo168.com/open/sdk/ldgame.js";
    var PAY_RET_URL = "http://plugins.dawawa.com/crosspolicy.html?ly_act=payCallback";
    var SERVER_TIME = "http://paycenter.layabox.com/?a=Pay&m=Payment&ac=getTime&sp=[SP_ID]&openKey=[OPEN_KEY]&token=[ACCESS_TOKEN]";

    function SPSdk() {
        this.spId = 0;
        this.appId = "";
        this.appKey = "";
        this.access_token = "";
        this.openKey = "";
        this.app_key = "";
        this.debug = true;

        this.mobo168 = null;
        this.uid = 0;
        this.nickname = "";
        this.sex = 0;
        this.headimgurl = "";

        this.app_key = "";
        this.game_url = "";
        this.host = "";
        this.login_type = "";
        this.nonce = "";
        this.open_id = "";
        this.signature = "";
        this.systemname = "";
        this.ticket = "";
        this.timestamp = "";

        this.cn = "";
    }

    var __proto = SPSdk.prototype;
    __proto.login = function (param, callback) {
        console.log("百思不得姐登录：" + JSON.stringify(param));
        var m_this = this;
        if (param.ret == 0) {
            m_this.mobo168.getuserinfo(function (user) {
                m_this.cn = user.cn;
                m_this.open_id = user.userkey;
                m_this.nickname = user.nickname;
                callback && callback({
                    "result": 0,
                    "spuid": user.userkey,
                    "nickname": user.nickname
                });
            });
        }
        else
            callback && callback({
                "result": -2,
                "desc": "login error"
            });
    };
    __proto.pay = function (param, callback) {
        var m_this = this;
        console.log("百思不得姐支付：" + JSON.stringify(param));
        //var url = SERVER_TIME.replace(/\[SP_ID\]/, m_this.spId).replace(/\[OPEN_KEY\]/, m_this.openKey).replace(/\[ACCESS_TOKEN\]/, m_this.access_token);
        //LayaCommon.getJson(url, function (param1) {

           // var serTime = param1.data;

        var timestamp=Math.round(new Date().getTime()/1000);
            var data = {
                app_key: m_this.app_key,
                game_orderno: param.data.orderId,
                nonce: m_this.nonce,
                notify_url: param.data.other.notifyUrl,
                open_id: m_this.open_id,
                subject: param.data.goodsName,
                timestamp: timestamp,
                //timestamp: serTime,
                total_fee: (parseFloat(param.data.amount) / 100.00),
                signature: ""
            };

            var source = "app_key=" + m_this.app_key
                + "&game_orderno=" + param.data.orderId
                + "&nonce=" + m_this.nonce
                + "&notify_url=" + param.data.other.notifyUrl
                + "&open_id=" + m_this.open_id
                + "&subject=" + param.data.goodsName
                + "&timestamp=" + timestamp
                //+ "&timestamp=" + serTime
                + "&total_fee=" + data.total_fee
                + "&" + m_this.appKey;
            data.signature = md5(source);

            m_this.mobo168.pay(data, function (param) {
                callback && callback({"result": 0, "desc": "OK"});

                data.sign = md5(data.orderid + "" + data.money + "" + m_this.appId + "" + m_this.appKey);
                window.parent.postMessage(data, "*");
                window.addEventListener("message", function (param) {
                    if (param.data.action == "pay:callback") {
                        if (param.data.status == 1)
                            callback && callback({
                                "result": "0",
                                "desc": "pay success",
                                "orderId": param.data.orderid,
                                "amount": param.data.money
                            });
                        else
                            callback && callback({"result": "-2", "desc": "pay failed"});
                    }
                    else if (param.data.action == "pay:cancel") {
                        callback && callback({"result": "-3", "desc": "pay cancel"});
                    }
                })
            });
       // });
    };

    __proto.init = function (param, callback) {
        console.log("百思不得姐初始化：" + JSON.stringify(param));
        var m_this = this;
        LayaCommon.loadScript(SDK_URL, function () {
            m_this.spId = param.spId;
            m_this.appId = param.appId;
            m_this.appKey = param.appKey;
            m_this.openKey = param.openKey;
            m_this.access_token = param.access_token;
            m_this.app_key = param.queryParams.app_key;
            m_this.game_url = param.queryParams.game_url;
            m_this.host = param.queryParams.host;
            m_this.login_type = param.queryParams.login_type;
            m_this.nonce = param.queryParams.nonce;
            m_this.open_id = param.queryParams.open_id;
            m_this.signature = param.queryParams.signature;
            m_this.systemname = param.queryParams.systemname;
            m_this.ticket = param.queryParams.ticket;
            m_this.timestamp = param.queryParams.timestamp;

            var source = "app_key=" + m_this.app_key
                + "&game_url=" + decodeURIComponent(m_this.game_url)
                + "&nonce=" + m_this.nonce
                + "&ticket=" + m_this.ticket
                + "&timestamp=" + m_this.timestamp
                + "&" + m_this.appKey;
            if (md5(source).toUpperCase() == m_this.signature) {

                m_this.mobo168 = new ldgame({"app_key": m_this.app_key});
                callback && callback({"result": 0, "desc": "OK"});
            }
            else
                callback && callback({"result": -1, "desc": "sign check error!"});
        }, function () {
            callback({"ret": -1, "msg": "plugin download error"});
        });
    };

    function md5(str) {
        function rl(l, i) {
            return (l << i) | (l >>> (32 - i));
        }

        function au(lX, lY) {
            var lX4, lY4, lX8, lY8, lr;
            lX8 = (lX & 0x80000000);
            lY8 = (lY & 0x80000000);
            lX4 = (lX & 0x40000000);
            lY4 = (lY & 0x40000000);
            lr = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
            if (lX4 & lY4) {
                return (lr ^ 0x80000000 ^ lX8 ^ lY8);
            }
            if (lX4 | lY4) {
                if (lr & 0x40000000) {
                    return (lr ^ 0xC0000000 ^ lX8 ^ lY8);
                } else {
                    return (lr ^ 0x40000000 ^ lX8 ^ lY8);
                }
            } else {
                return (lr ^ lX8 ^ lY8);
            }
        }

        function f(x, y, z) {
            return (x & y) | ((~x) & z);
        }

        function g(x, y, z) {
            return (x & z) | (y & (~z));
        }

        function h(x, y, z) {
            return (x ^ y ^ z);
        }

        function i(x, y, z) {
            return (y ^ (x | (~z)));
        }

        function ff(a, b, c, d, x, s, ac) {
            a = au(a, au(au(f(b, c, d), x), ac));
            return au(rl(a, s), b);
        }

        function gg(a, b, c, d, x, s, ac) {
            a = au(a, au(au(g(b, c, d), x), ac));
            return au(rl(a, s), b);
        }

        function hh(a, b, c, d, x, s, ac) {
            a = au(a, au(au(h(b, c, d), x), ac));
            return au(rl(a, s), b);
        }

        function ii(a, b, c, d, x, s, ac) {
            a = au(a, au(au(i(b, c, d), x), ac));
            return au(rl(a, s), b);
        }

        function cta(str) {
            var wc;
            var ml = str.length;
            var tmp1 = ml + 8;
            var tmp2 = (tmp1 - (tmp1 % 64)) / 64;
            var nw = (tmp2 + 1) * 16;
            var wa = Array(nw - 1);
            var bp = 0;
            var bc = 0;
            while (bc < ml) {
                wc = (bc - (bc % 4)) / 4;
                bp = (bc % 4) * 8;
                wa[wc] = (wa[wc] | (str.charCodeAt(bc) << bp));
                bc++;
            }
            wc = (bc - (bc % 4)) / 4;
            bp = (bc % 4) * 8;
            wa[wc] = wa[wc] | (0x80 << bp);
            wa[nw - 2] = ml << 3;
            wa[nw - 1] = ml >>> 29;
            return wa;
        }

        function wth(lv) {
            var wthv = "", temp = "", lb, lc;
            for (lc = 0; lc <= 3; lc++) {
                lb = (lv >>> (lc * 8)) & 255;
                temp = "0" + lb.toString(16);
                wthv = wthv + temp.substr(temp.length - 2, 2);
            }
            return wthv;
        }

        function ue(str) {
            str = str.replace(/\r\n/g, "\n");
            var ut = "";
            for (var n = 0; n < str.length; n++) {
                var c = str.charCodeAt(n);
                if (c < 128) {
                    ut += String.fromCharCode(c);
                } else if ((c > 127) && (c < 2048)) {
                    ut += String.fromCharCode((c >> 6) | 192);
                    ut += String.fromCharCode((c & 63) | 128);
                } else {
                    ut += String.fromCharCode((c >> 12) | 224);
                    ut += String.fromCharCode(((c >> 6) & 63) | 128);
                    ut += String.fromCharCode((c & 63) | 128);
                }
            }
            return ut;
        }

        var x = [];
        var k, AA, BB, CC, DD, a, b, c, d;
        var S11 = 7, S12 = 12, S13 = 17, S14 = 22;
        var S21 = 5, S22 = 9, S23 = 14, S24 = 20;
        var S31 = 4, S32 = 11, S33 = 16, S34 = 23;
        var S41 = 6, S42 = 10, S43 = 15, S44 = 21;
        str = ue(str);
        x = cta(str);
        a = 0x67452301;
        b = 0xEFCDAB89;
        c = 0x98BADCFE;
        d = 0x10325476;
        for (k = 0; k < x.length; k += 16) {
            AA = a;
            BB = b;
            CC = c;
            DD = d;
            a = ff(a, b, c, d, x[k + 0], S11, 0xD76AA478);
            d = ff(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
            c = ff(c, d, a, b, x[k + 2], S13, 0x242070DB);
            b = ff(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
            a = ff(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
            d = ff(d, a, b, c, x[k + 5], S12, 0x4787C62A);
            c = ff(c, d, a, b, x[k + 6], S13, 0xA8304613);
            b = ff(b, c, d, a, x[k + 7], S14, 0xFD469501);
            a = ff(a, b, c, d, x[k + 8], S11, 0x698098D8);
            d = ff(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
            c = ff(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
            b = ff(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
            a = ff(a, b, c, d, x[k + 12], S11, 0x6B901122);
            d = ff(d, a, b, c, x[k + 13], S12, 0xFD987193);
            c = ff(c, d, a, b, x[k + 14], S13, 0xA679438E);
            b = ff(b, c, d, a, x[k + 15], S14, 0x49B40821);
            a = gg(a, b, c, d, x[k + 1], S21, 0xF61E2562);
            d = gg(d, a, b, c, x[k + 6], S22, 0xC040B340);
            c = gg(c, d, a, b, x[k + 11], S23, 0x265E5A51);
            b = gg(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
            a = gg(a, b, c, d, x[k + 5], S21, 0xD62F105D);
            d = gg(d, a, b, c, x[k + 10], S22, 0x2441453);
            c = gg(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
            b = gg(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
            a = gg(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
            d = gg(d, a, b, c, x[k + 14], S22, 0xC33707D6);
            c = gg(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
            b = gg(b, c, d, a, x[k + 8], S24, 0x455A14ED);
            a = gg(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
            d = gg(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
            c = gg(c, d, a, b, x[k + 7], S23, 0x676F02D9);
            b = gg(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
            a = hh(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
            d = hh(d, a, b, c, x[k + 8], S32, 0x8771F681);
            c = hh(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
            b = hh(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
            a = hh(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
            d = hh(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
            c = hh(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
            b = hh(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
            a = hh(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
            d = hh(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
            c = hh(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
            b = hh(b, c, d, a, x[k + 6], S34, 0x4881D05);
            a = hh(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
            d = hh(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
            c = hh(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
            b = hh(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
            a = ii(a, b, c, d, x[k + 0], S41, 0xF4292244);
            d = ii(d, a, b, c, x[k + 7], S42, 0x432AFF97);
            c = ii(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
            b = ii(b, c, d, a, x[k + 5], S44, 0xFC93A039);
            a = ii(a, b, c, d, x[k + 12], S41, 0x655B59C3);
            d = ii(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
            c = ii(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
            b = ii(b, c, d, a, x[k + 1], S44, 0x85845DD1);
            a = ii(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
            d = ii(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
            c = ii(c, d, a, b, x[k + 6], S43, 0xA3014314);
            b = ii(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
            a = ii(a, b, c, d, x[k + 4], S41, 0xF7537E82);
            d = ii(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
            c = ii(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
            b = ii(b, c, d, a, x[k + 9], S44, 0xEB86D391);
            a = au(a, AA);
            b = au(b, BB);
            c = au(c, CC);
            d = au(d, DD);
        }
        var ret = (wth(a) + wth(b) + wth(c) + wth(d)).toLowerCase()
        x.length = 0;
        x = [];
        return ret;
    }

    return SPSdk;
})
();